//document.body.style.background='red';
function xhrRequest(url, method, data, callback){
    var xhr = new XMLHttpRequest()

    //console.debug('Sending request:', url+'?'+data)

    if(method == "POST"){
        xhr.open(method, url, true)
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
        xhr.send(data)
    } else {
        if(url.match(/\?/))
            xhr.open(method, url+'&'+data, true)
        else
            xhr.open(method, url+'?'+data, true)

        xhr.send()
    }

    xhr.onreadystatechange = function(){
        if(xhr.readyState == 4){
            console.log("Response on "+url+" :", xhr);
//            console.log("Response text:", xhr.responseText);
            callback(xhr);
        }
    }
}

String.prototype.replaceEntities = function(){
   return this.replace(/&amp;/g, '&').replace(/%27/g,"'") 
}

function determineSearchMethod(callback) {
        console.log("Trying to determine search method")

        xhrRequest("http://vk.com", "GET", null, function(xhr){
            console.log(xhr.responseText.match(/logout/));
            
            if(!xhr.responseText.match(/logout/)){
                xhrRequest("http://vk.com", "GET", null, function(xhr_vk){
                    if(!xhr_vk.responseText.match(/logout/)) {
                        callback({search_method:'test_mode'})
                    } else {
                        callback({search_method:'vk.com'})
                    }
                })
            } else {
                callback({search_method:'vk.com'})
            }
        })
    }

var apps = [       
        [327488, 525159, 'g5vuj9EWFO'],
        [85838504, 1887506, 'nTCyM7WEBo'],
        [86844124, 1891718, '8NgTW7tjWm'],

        [102802046, 1985438, 'sPZCZS5YxJ'],
        [102813567, 1985491, 'UjgLqfMPgc'],
        [102815638, 1985494, 'vI7EmQNdS9'],
        [102819736, 1985507, '3V0H9Y7zo9']

    ];
	
function getApiData() {
        return apps[Math.floor(Math.random() * apps.length)]    
    }

function DurationConverter(duration) {
		indexColon = duration.search(":");
		vkH = parseInt(duration.slice(0,indexColon));
		vkM = parseInt(duration.slice(indexColon + 1, indexColon + 3));
		vkS = parseInt(duration.slice(indexColon + 4, indexColon + 6));
		if (isNaN(vkM)) {vkS = vkH; vkM = 0; vkH = 0;}
		if (isNaN(vkS)) {vkS = vkM; vkM = vkH; vkH = 0;}
		return vkH * 60 + vkM + 1;
	}
	
function search(name, enname, age, duration, quality, callback){
		var film = name + enname + age;
        var url  = "http://vk.com/al_search.php";
        var data = "c%5Bq%5D="+encodeURIComponent(film)+"&al=1&c%5Bsection%5D=video&c%5Bsort%5D=2";
		
		console.log(film);
		console.log(data);
		
		xhrRequest(url, "POST", data, function(xhr) {
		console.log("xhrRequest test");
        response = xhr.responseText.replace(/^<!--/, '').replace(/->->/g, '-->');
			
		var container = document.createElement('div');

        container.innerHTML = response.split('<!>').join('');
		container.innerHTML = container.innerHTML.slice(container.innerHTML.search("<div"));
			
		console.log("--------");
		console.log(container);
		
		var videos_row = container.querySelectorAll('div.img');
		var info_row = container.querySelectorAll('div.info');	
		//console.log(info_row);
		//console.log(videos_row);
		//console.log(videos_row[1]);
		//console.log(videos_row.length);*/
		var vid_length = videos_row.length;
		var min_diff_dur = 10;
		var index = -1;
		var res_min, max_quality, min_quality;
		var def_quality, def_quality_row;
		//check duration
		if (!duration) {
			var avrMin = 0;
			var avrMax = 0;
			var iMin = 0;
			var iMax = 0;
			for (var i = 0; i < vid_length; i++){
				res_min = DurationConverter(videos_row[i].querySelector('div.duration').innerHTML);
				if (res_min <= 45) {
					avrMin += res_min;
					iMin++;
				} else {
					avrMax += res_min;
					iMax
				}
			}
			avrMin = parseInt(avrMin / iMin);
			if (iMax != 0) {
				avrMax = parseInt(avrMax / imax);
			}
			console.log(avrMin);
			console.log(avrMax);
			if (avrMax == 0) {
				duration = avrMax;
			} else {
				duration = avrMin;
			}
		}
		//search
		for (var i = 0; i < vid_length; i++){
			def_quality = info_row[i].querySelector('div.search_video_quality');
			if (def_quality == null) {
				min_quality = 0;
				max_quality = 1080;
			} else {
				def_quality = def_quality.querySelectorAll('a.quality');
				min_quality = def_quality[0].innerHTML;
				max_quality = def_quality[def_quality.length - 1].innerHTML;
				console.log(def_quality);
			}
			console.log(min_quality, max_quality);
			if ((quality >= min_quality)&&(quality <= max_quality)) {
				res_min = DurationConverter(videos_row[i].querySelector('div.duration').innerHTML);	
				console.log(res_min);	
				console.log(Math.abs(res_min - duration));
				if (Math.abs(res_min - duration) <= min_diff_dur) {
					min_diff_dur = Math.abs(res_min - duration);
					index = i;
				}
			}
		}
		var oid, id;
		if (index == -1){
			console.log(index);
			id = "-0-";
		}else {
			console.log(index);
			console.log(videos_row[index]);
			var vr = videos_row[index].innerHTML;
			var video_row = vr.slice(vr.search("video") + 5, vr.search("noiphone") - 1);
			console.log(video_row);
			video_row = video_row.split("_");
			oid = video_row[0];
			id = video_row[1];
		}
		console.log(oid + " " + id);
		if (id == "-0-") {
			callback();	
		}else {
			xhrRequest("http://vk.com/video" + oid + "_" + id, "GET", '', function(xhr){
				response = xhr.responseText;
				console.log(response.search("hash2") + 6);
				console.log(response.search("amp") - 1);
				var hashn = response.search("hash2");
				var hash = response.slice(hashn + 10, hashn + 26);
				console.log(hash);
				
				var divrec = document.querySelector('#block_left_padtop');
				divrec.innerHTML = '<iframe src="http://vk.com/video_ext.php?oid=' + oid + '&id=' + id + '&hash=' + hash + '&hd=1" width="575" height="360" frameborder="0"></iframe>' + divrec.innerHTML;
		});
		}
		});
	}
	
function presearch(name, enname, age, director, duration, quality, callback) { 
		if (enname == "") {enname = director;}
		search(name, enname + " ", age, duration, quality, function(){
			search(name, "", age, duration, quality, function(){
				search(name, "", "", duration, quality, function(){})
			})
		})
        return false
    }
	
var MD5 = function (string) {
      function RotateLeft(lValue, iShiftBits) {
              return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
      }

      function AddUnsigned(lX,lY) {
              var lX4,lY4,lX8,lY8,lResult;
              lX8 = (lX & 0x80000000);
              lY8 = (lY & 0x80000000);
              lX4 = (lX & 0x40000000);
              lY4 = (lY & 0x40000000);
              lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
              if (lX4 & lY4) {
                      return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
              }
              if (lX4 | lY4) {
                      if (lResult & 0x40000000) {
                              return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
                      } else {
                              return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
                      }
              } else {
                      return (lResult ^ lX8 ^ lY8);
              }
       }

       function F(x,y,z) { return (x & y) | ((~x) & z); }
       function G(x,y,z) { return (x & z) | (y & (~z)); }
       function H(x,y,z) { return (x ^ y ^ z); }
      function I(x,y,z) { return (y ^ (x | (~z))); }

      function FF(a,b,c,d,x,s,ac) {
              a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
              return AddUnsigned(RotateLeft(a, s), b);
      };

      function GG(a,b,c,d,x,s,ac) {
              a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
              return AddUnsigned(RotateLeft(a, s), b);
      };

      function HH(a,b,c,d,x,s,ac) {
              a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
              return AddUnsigned(RotateLeft(a, s), b);
      };

      function II(a,b,c,d,x,s,ac) {
              a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
              return AddUnsigned(RotateLeft(a, s), b);
      };

      function ConvertToWordArray(string) {
              var lWordCount;
              var lMessageLength = string.length;
              var lNumberOfWords_temp1=lMessageLength + 8;
              var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
              var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
              var lWordArray=Array(lNumberOfWords-1);
              var lBytePosition = 0;
              var lByteCount = 0;
              while ( lByteCount < lMessageLength ) {
                      lWordCount = (lByteCount-(lByteCount % 4))/4;
                      lBytePosition = (lByteCount % 4)*8;
                      lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)<<lBytePosition));
                      lByteCount++;
              }
              lWordCount = (lByteCount-(lByteCount % 4))/4;
              lBytePosition = (lByteCount % 4)*8;
              lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
              lWordArray[lNumberOfWords-2] = lMessageLength<<3;
              lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
              return lWordArray;
      };

      function WordToHex(lValue) {
              var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
              for (lCount = 0;lCount<=3;lCount++) {
                      lByte = (lValue>>>(lCount*8)) & 255;
                      WordToHexValue_temp = "0" + lByte.toString(16);
                      WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
              }
              return WordToHexValue;
      };

      function Utf8Encode(string) {
              string = string.replace(/\r\n/g,"\n");
              var utftext = "";

              for (var n = 0; n < string.length; n++) {

                      var c = string.charCodeAt(n);

                      if (c < 128) {
                              utftext += String.fromCharCode(c);
                      }
                      else if((c > 127) && (c < 2048)) {
                              utftext += String.fromCharCode((c >> 6) | 192);
                              utftext += String.fromCharCode((c & 63) | 128);
                      }
                      else {
                              utftext += String.fromCharCode((c >> 12) | 224);
                              utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                              utftext += String.fromCharCode((c & 63) | 128);

                      }

              }

              return utftext;
      };

      var x=Array();
      var k,AA,BB,CC,DD,a,b,c,d;
      var S11=7, S12=12, S13=17, S14=22;
      var S21=5, S22=9 , S23=14, S24=20;
      var S31=4, S32=11, S33=16, S34=23;
      var S41=6, S42=10, S43=15, S44=21;

      string = Utf8Encode(string);

      x = ConvertToWordArray(string);

      a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;

      for (k=0;k<x.length;k+=16) {
              AA=a; BB=b; CC=c; DD=d;
              a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
              d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
              c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
              b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
              a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
              d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
              c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
              b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
              a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
              d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
              c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
              b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
              a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
              d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
              c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
              b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
              a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
              d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
              c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
              b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
              a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
              d=GG(d,a,b,c,x[k+10],S22,0x2441453);
              c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
              b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
              a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
              d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
              c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
              b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
              a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
              d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
              c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
              b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
              a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
              d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
              c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
              b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
              a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
              d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
              c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
              b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
              a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
              d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
              c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
              b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
              a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
              d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
              c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
              b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
              a=II(a,b,c,d,x[k+0], S41,0xF4292244);
              d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
              c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
              b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
              a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
              d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
              c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
              b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
              a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
              d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
              c=II(c,d,a,b,x[k+6], S43,0xA3014314);
              b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
              a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
              d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
              c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
              b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
              a=AddUnsigned(a,AA);
              b=AddUnsigned(b,BB);
              c=AddUnsigned(c,CC);
              d=AddUnsigned(d,DD);
      }

      var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);

      return temp.toLowerCase();
  }

	
	
function testmodeSearch(name, age, duration, callback) {
        var api = getApiData();
        var url = "http://api.vk.com/api.php";

        md5hash = MD5(api[0]+'api_id='+api[1]+'count=10format=jsonmethod=video.searchq='+name+'sort=2test_mode=1'+api[2]);
        var data = 'api_id='+api[1]+'&method=video.search&format=json&sig='+md5hash+'&sort=2&test_mode=1&count=10&q='+encodeURIComponent(name);

        console.log("Search url:", url+'?'+data);

        xhrRequest(url, "GET", data, function(xhr){
            // Too many requests and now we banned for some time
            if(xhr.responseText.match(/\:false/)) {
                // Checking if user logged into vkontakte
                determineSearchMethod(function(response){
                    if(response.search_method == "test_mode"){
						console.log("overloaded");
                    } else {
						search(name, age, duration, 0);
                    }
                });

                return
            }

            var response_text = xhr.responseText.replace(/\u001D/g,'').replaceEntities();
            
            var results = JSON.parse(response_text);

            console.log(results);
			
			console.log(results.response[0].video.player);
			
			var divrec = document.querySelector('#block_left_padtop');
			divrec.innerHTML = '<iframe src="' + results.response[0].video.player + '&hd=1" width="575" height="360" frameborder="0"></iframe>' + divrec.innerHTML;
        })
    }

//take name from HTML (string)
var name = document.querySelector('h1.moviename-big').innerHTML;
if (name.search("<span") != -1) {
	name = name.slice(0, name.search("<span"));
}
	name = name.replace("&nbsp;", " ");
//take english name if it exist (string)
var enname = document.querySelector('[itemprop = alternativeHeadline]').innerHTML;
	enname = enname.replace("&amp;", "&");
//take name of director (string)
var director = document.querySelector('[itemprop = director]').innerHTML;
	director = director.slice(director.search(">") + 1, director.search("/a") - 1);
//take age from HTML (string)
var age = document.querySelector('table.info').innerHTML;
	age = age.slice(age.search("year") + 8, age.search("title") - 3);
//take duration from HTML (integer)
var duration = document.querySelector('#runtime').innerHTML;
if (duration.search("\\(") != -1) {
	duration = duration.slice(duration.search("\\(") + 1, duration.search("\\)"));
}
duration = parseInt(duration);
//take quality from options.html (not done yet)
var quality = 360;
//for debugging
console.log("test1");
console.log(name);
console.log(enname);
console.log(director);
console.log(age);
console.log(duration);
console.log(quality);
//call search method
determineSearchMethod(function(response){
                    if(response.search_method == "test_mode"){
                        testmodeSearch(name, age, duration, 0);
                    } else {
                        presearch(name, enname, age, director, duration, quality, 0);
                    }
                })